package com.jhy;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @description:
 * @author: jhy
 * @time: 2021/4/23 19:15
 */

//通过反射创建对象,并调用指定方法
public class ReflectGetCatTest {

    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

        //1.使用Properties类读取配置文件re.properties
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/re.properties"));
        String classpath = properties.get("classpath").toString();//读到配置文件中的值，com.jhy.Cat
        String method = properties.get("method").toString();//读到配置文件中的值，hi
        System.out.println("读取配置文件，classpath = " + classpath);
        System.out.println("读取配置文件，method = " + method);

        //2.通过反射生成类对象和方法对象
        //2.1通过Class.forName("")拿到Class类对象
        Class cls = Class.forName(classpath);

        //2.2通过newInstance()得到类对象的实例
        Object o = cls.newInstance();//就是Cat的实例

        //2.3通过getMethod("")拿到方法对象---->在反射中，可以把方法视为对象，一切皆对象
        Method methodObject = cls.getMethod(method);

        //2.4通过method的invoke()方法实现方法调用
        //一般调用方法 对象.方法  反射机制：方法.invoke(对象)
        methodObject.invoke(o);

    }
}
